import java.awt.*;

/**
 * 蛇管理类
 * 
 * @author 烦得很
 */
public class SnackManager {
    /**
     * 蛇的全部移动方向
     */
    public static enum snackMoveDirs {
        up, down, left, right;
    }

    private final int[] snackHeadOrigin = new int[] { 6, 5 }; // 固定出生位置,默认向右运动
    private final int[] snackBodyOrigin = new int[] { 6, 4 }; // 固定出生位置在蛇身的左边
    private int[] preSnackEnd = new int[2]; // 用于记录前蛇尾坐标
    private int[][] snackAllNodes = new int[100][2]; // 蛇的全部坐标
    private int top;
    private static snackMoveDirs snackNowMoveDir = snackMoveDirs.right;

    /**
     * 获取现在蛇的移动方向
     * 
     * @return 蛇的运动方向
     */
    public static snackMoveDirs getSnackNowMoveDir() {
        return snackNowMoveDir;
    }

    /**
     * 获得蛇的全部坐标
     * 
     * @return 蛇的全部坐标
     */
    public int[][] getSnackAllNodes() {
        return snackAllNodes;
    }

    /**
     * 获取栈顶，即蛇尾坐标
     * 
     * @return 返回栈顶蛇尾坐标
     */
    public int getTop() {
        return top;
    }

    /**
     * 获得蛇头坐标
     * 
     * @return 蛇头坐标
     */
    public int[] getSnackHead() {
        return snackAllNodes[0];
    }

    /**
     * 获得蛇当前的移动方向
     * 
     * @return 蛇当前的移动方向
     */
    public snackMoveDirs getSnackNowDir() {
        return snackNowMoveDir;
    }

    /**
     * 设置蛇当前的移动方向
     * 
     * @param val 当前蛇的移动方向
     */
    public void setSnackNowMoveDir(snackMoveDirs val) {
        snackNowMoveDir = val;
    }

    // /**
    // * 设置前蛇尾坐标
    // * @param val 前蛇尾坐标
    // */
    // public void setSnackEndCurrent(int[] val) {
    // snackEndCurrent = val.clone();
    // }

    /**
     * 初始化蛇
     */
    public SnackManager() {
        snackAllNodes[0] = snackHeadOrigin.clone();
        snackAllNodes[1] = snackBodyOrigin.clone();
        top = 1;
    }

    /**
     * 增加蛇身长度
     */
    public void addSnackBody() {
        GameManager.getGameRender().drawArea(preSnackEnd);
        snackAllNodes[++top] = preSnackEnd.clone();
    }

    /**
     * 蛇移动
     * 
     * @param dir 方向
     */
    public void snackMove(snackMoveDirs dir) {
        Color canGoColor = GameManager.getGameRender().getCanGoSpaceColor();
        switch (dir) {
            case up:
                preSnackEnd = snackAllNodes[top].clone();
                GameManager.getGameRender().drawArea(preSnackEnd, canGoColor);
                snackBodyMove();
                snackAllNodes[0][0] -= 1;
                break;
            case down:
                preSnackEnd = snackAllNodes[top].clone();
                GameManager.getGameRender().drawArea(preSnackEnd, canGoColor);
                snackBodyMove();
                snackAllNodes[0][0] += 1;
                break;
            case left:
                preSnackEnd = snackAllNodes[top].clone();
                GameManager.getGameRender().drawArea(preSnackEnd, canGoColor);
                snackBodyMove();
                snackAllNodes[0][1] -= 1;
                break;
            case right:
                preSnackEnd = snackAllNodes[top].clone();
                GameManager.getGameRender().drawArea(preSnackEnd, canGoColor);
                snackBodyMove();
                snackAllNodes[0][1] += 1;
                break;
        }
    }

    /**
     * 蛇身迭代移动
     */
    private void snackBodyMove() {
        for (int i = top; i > 0; i--) {
            snackAllNodes[i] = snackAllNodes[i - 1].clone();
        }
    }
}
